package com.jf.juc.c_000;

public class T003_Sleep_Yield_Join {

    public static void main(String[] args) {
//        testSleep();

//        testYield();

        testJoin();
    }

    /*  Sleep 睡眠，当前线程暂停一段时间，让给其他的线程去执行。
        Sleep 设定的睡眠时间结束后，线程自动重新执行。*/
    static void testSleep() {
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(" A " + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /*Yield 是当前线程正在执行的时候停止下来，然后进入等待队列。当前回到等待队列的线程在系统的调度算法中，还是依然有可能把刚刚停止的线程再次拿出来执行的。
      Yield 的意思可以理解为让出一下CPU，谁抢到算谁的。*/
    static void testYield() {
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(" A " + i);
                if (i % 10 == 0) {
                    Thread.yield();
                }
            }
        }).start();

        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(" B " + i);
                if (i % 10 == 0) {
                    Thread.yield();
                }
            }
        }).start();
    }

    /* join 是在自己当前线程加入你调用Join的线程，本线程等待。等调用的线程运行完了，自己再去执行。
       T1 和 T2 两个线程，在T1的某个点上调用了T2.join,它会跑到T2去运行，T1等待T2运行完毕继续T1运行。*/
    static void testJoin() {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(" t1 " + i);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 100; i++) {
                System.out.println(" t2 " + i);
//                try {
//                    Thread.sleep(500);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
            }
        });

        t1.start();
        t2.start();
    }

}
